package com.helin.helinhealth.utils;

import com.baomidou.mybatisplus.generator.FastAutoGenerator;
import com.baomidou.mybatisplus.generator.config.OutputFile;
import com.baomidou.mybatisplus.generator.engine.FreemarkerTemplateEngine;

import java.util.Collections;

/**
 * MyBatis-Plus 代码生成器
 * 作用：自动生成Entity、Mapper、Service、Controller等层代码
 * 使用前提：
 * 1. 数据库表已创建
 * 2. pom.xml已配置mybatis-plus-generator依赖
 */
public class CodeGenerator {
    public static void main(String[] args) {
        System.getProperty("user.dir");
        // 获取项目根目录绝对路径（例如：/Users/hunternotgod/Desktop/helin-health）
        String projectPath = System.getProperty("user.dir");
        FastAutoGenerator.create(
                        // 数据库连接配置（需根据实际情况修改）
                        "jdbc:mysql://localhost:3306/helin_health?useSSL=false&allowPublicKeyRetrieval=true&useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai",
                        "root",  // 数据库用户名
                        "root"   // 数据库密码
                )
                // ====================== 全局配置 ======================
                .globalConfig(builder -> {
                    builder
                            .author("HuangHaihang")       // 开发者姓名（会生成在类注释中）
                            .enableSwagger()              // 启用Swagger注解（生成@Api等注解）
                            .outputDir(projectPath + "/src/main/java")  // 指定Java代码输出目录
                            .disableOpenDir();            // 禁用生成后自动打开目录
                })

                // ====================== 包配置 ======================
                .packageConfig(builder -> {
                    builder
                            .parent("com.helin.helinhealth")  // 父包名（生成的所有代码都会在这个包下）
                            .moduleName("")                   // 子模块名（不需要设为空字符串）
                            .entity("entity")                 // 实体类包名
                            .service("service")               // Service接口包名
                            .serviceImpl("service.impl")       // Service实现类包名
                            .controller("controller")         // Controller包名
                            .mapper("mapper")                 // Mapper接口包名
                            .xml("mapper")                    // Mapper XML文件包名
                            // 指定XML文件生成路径（resources/mapper目录）
                            .pathInfo(Collections.singletonMap(
                                    OutputFile.xml,
                                    projectPath + "/src/main/resources/mapper"
                            ));
                })

                // ====================== 策略配置 ======================
                .strategyConfig(builder -> {
                    builder
                            // 需要生成的表名（多个表用逗号分隔）
                            .addInclude("ai_qa", "emergency_call", "health_record",
                                    "health_report", "medicine", "medicine_log", "user")

                            // ===== 实体类策略 =====
                            .entityBuilder()
                            .enableLombok()             // 启用Lombok（自动生成getter/setter）
                            .enableTableFieldAnnotation() // 启用字段注解（生成@TableField注解）
                            .logicDeleteColumnName("is_deleted") // 逻辑删除字段名

                            // ===== Controller策略 =====
                            .controllerBuilder()
                            .enableRestStyle()          // 生成@RestController控制器

                            // ===== Mapper策略 =====
                            .mapperBuilder()
                            .enableMapperAnnotation();  // 生成@Mapper注解
                })

                // 使用Freemarker模板引擎（默认Velocity）
                .templateEngine(new FreemarkerTemplateEngine())

                // 执行生成
                .execute();
    }
}